package org.jeecg.modules.cw.service.impl;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.shiro.SecurityUtils;
import org.jeecg.common.system.api.ISysBaseAPI;
import org.jeecg.common.system.vo.LoginUser;
import org.jeecg.modules.cw.entity.CwJbszqkzb;
import org.jeecg.modules.cw.entity.CwJbszqkzbZhu;
import org.jeecg.modules.cw.entity.CwPpryTj;
import org.jeecg.modules.cw.entity.CwPpry;
import org.jeecg.modules.cw.mapper.CwPpryMapper;
import org.jeecg.modules.cw.mapper.CwPpryTjMapper;
import org.jeecg.modules.cw.service.ICwJbszqkzbService;
import org.jeecg.modules.cw.service.ICwJbszqkzbZhuService;
import org.jeecg.modules.cw.service.ICwPpryTjService;
import org.jeecg.modules.system.entity.SysDepart;
import org.jeecg.modules.system.service.ISysDepartService;
import org.springframework.stereotype.Service;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Arrays;
import java.util.List;
import java.util.Collection;


/**
 * @Description: 派遣人员、退休返聘人员、借调人员费用体表
 * @Author: jeecg-boot
 * @Date:   2025-09-08
 * @Version: V1.0
 */
@Service
public class CwPpryTjServiceImpl extends ServiceImpl<CwPpryTjMapper, CwPpryTj> implements ICwPpryTjService {

	@Autowired
	private CwPpryTjMapper cwPpryTjMapper;
	@Autowired
	private CwPpryMapper cwPpryMapper;
	@Autowired
	private ICwJbszqkzbService cwJbszqkzbService;
	@Autowired
	private ICwJbszqkzbZhuService cwJbszqkzbZhuService;
	@Autowired
	private ISysDepartService sysDepartService;
	@Autowired
	private ISysBaseAPI iSysBaseAPI;
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void saveMain(CwPpryTj cwPpryTj, List<CwPpry> cwPpryList) {
		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
		cwPpryTjMapper.insert(cwPpryTj);
		// 其他工资福利支出
		Double acz = 0.0;
		Double afcz = 0.0;

		// 兼容 Java 8：用 Arrays.asList() 替代 List.of()（Java 8及以下版本支持）
		List<String> calculateTypes = Arrays.asList("所派遣有保险", "院派遣", "借调");

		if (cwPpryList != null && cwPpryList.size() > 0) {
			for (CwPpry entity : cwPpryList) {
				// 1. 所有字段空值处理（统一设为 0.0，避免空指针）
				if (entity.getPostWage() == null) {
					entity.setPostWage(0.0);
				}
				if (entity.getIncrementalStep() == null) {
					entity.setIncrementalStep(0.0);
				}
				if (entity.getLivingAllowance() == null) {
					entity.setLivingAllowance(0.0);
				}
				if (entity.getWorkAllowance() == null) {
					entity.setWorkAllowance(0.0);
				}
				if (entity.getSanitationFee() == null) {
					entity.setSanitationFee(0.0);
				}
				if (entity.getJkbybt() == null) {
					entity.setJkbybt(0.0);
				}
				if (entity.getHealthSubsidies() == null) {
					entity.setHealthSubsidies(0.0);
				}
				if (entity.getHousingSubsidy() == null) {
					entity.setHousingSubsidy(0.0);
				}
				if (entity.getJcjxj() == null) {
					entity.setJcjxj(0.0);
				}
				if (entity.getXjgz() == null) {
					entity.setXjgz(0.0);
				}
				if (entity.getMeritPay() == null) {
					entity.setMeritPay(0.0);
				}
				if (entity.getSafety() == null) {
					entity.setSafety(0.0);
				}
				if (entity.getDeyb() == null) {
					entity.setDeyb(0.0);
				}
				if (entity.getHeatingFee() == null) {
					entity.setHeatingFee(0.0);
				}

				// 2. 判断是否为需要计算的人员类型（所派遣无保险/退休返聘）
				String dispatchY = entity.getDispatchY();
				// 注意：若 dispatchY 可能为 null，需先判空（避免空指针）
				if (dispatchY != null && calculateTypes.contains(dispatchY)) {
					// 3. 仅对指定类型执行计算逻辑（财政/非财政分支）
					Double heji = entity.getPostWage() + entity.getIncrementalStep() + entity.getLivingAllowance() +
							entity.getWorkAllowance() + entity.getSanitationFee() + entity.getJkbybt() +
							entity.getHealthSubsidies() + entity.getHousingSubsidy() + entity.getJcjxj();
					// 全年工资小计
					long gzxj = Math.round(heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety());
					// 计算shebao并保留两位小数
					Double shebaoTemp = (entity.getPostWage() + entity.getXjgz() + entity.getLivingAllowance() + entity.getWorkAllowance() +
							entity.getJkbybt() + entity.getJcjxj()) * 12 + entity.getPostWage() + entity.getXjgz();
					Double shebao = new BigDecimal(shebaoTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算yibao并保留两位小数
					Double yibaoTemp = (heji - entity.getIncrementalStep() + entity.getXjgz()) * 12;
					Double yibao = new BigDecimal(yibaoTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算gjjn并保留两位小数
					Double gjjnTemp = (heji - entity.getIncrementalStep() + entity.getXjgz()) * 12 + (entity.getPostWage() + entity.getXjgz()) + entity.getMeritPay() + entity.getSafety();
					Double gjjn = new BigDecimal(gjjnTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 各分项计算并分别保留两位小数
					Double item1 = new BigDecimal(shebao * 0.16).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item2 = new BigDecimal(yibao * 0.12).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item3 = new BigDecimal(shebao * 0.005).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item4 = new BigDecimal(shebao * 0.0035).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item5 = new BigDecimal(gjjn * 0.12).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算gjz（总和）
					Double gjz = new BigDecimal(item1 + item2 + item3 + item4 + item5 + entity.getDeyb()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					long lwf = Math.round((gjz + gzxj + entity.getHeatingFee()) * 0.03);

					if ("财政".equals(entity.getCzFcz())) {
						acz = gzxj + gjz + lwf + entity.getHeatingFee();
						entity.setSummation(acz);
					} else {
						afcz = gzxj + gjz + lwf + entity.getHeatingFee();
						entity.setSummation(afcz);
					}

					// 赋值计算结果字段
					entity.setRehearsalSession(entity.getPostWage() + entity.getXjgz());
					entity.setSbjfjs(shebao);
					entity.setYbjfjs(yibao);
					entity.setGjjjs(gjjn);
					entity.setYgfhj(heji);
					entity.setEndowmentInsurance(item1);
					entity.setMedicare(item2);
					entity.setUnemployment(item3);
					entity.setGsbx(item4);
					entity.setAccumulationFund(item5);
					entity.setQngjxj(new BigDecimal(heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety()).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
					entity.setQnsbjgjj(gjz);
					entity.setDispatchServiceFee(new BigDecimal(((heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety()) + entity.getHeatingFee() + gjz) * 0.03).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
				} else {
					// 4. 非指定人员类型：相关计算字段设为 0（避免空值）
					entity.setRehearsalSession(0.0);
					entity.setSbjfjs(0.0);
					entity.setYbjfjs(0.0);
					entity.setGjjjs(0.0);
					entity.setYgfhj(0.0);
					entity.setEndowmentInsurance(0.0);
					entity.setMedicare(0.0);
					entity.setUnemployment(0.0);
					entity.setGsbx(0.0);
					entity.setAccumulationFund(0.0);
					entity.setQngjxj(0.0);
					entity.setQnsbjgjj(0.0);
					entity.setDispatchServiceFee(0.0);
					entity.setSummation(0.0);
				}

				// 公共字段赋值（无论是否计算，都需设置）
				entity.setUnit(cwPpryTj.getUnit());
				entity.setYear(cwPpryTj.getYear());
				entity.setUserId(user.getId());
				entity.setMainId(cwPpryTj.getId()); // 外键设置

				// 插入数据库
				cwPpryMapper.insert(entity);
			}
		}
	}
	@Override
	@Transactional(rollbackFor = Exception.class)
	public void updateMain(CwPpryTj cwPpryTj, List<CwPpry> cwPpryList) {
		// 获取当前用户名
		LoginUser user = (LoginUser) SecurityUtils.getSubject().getPrincipal();
		String departIdsByOrgCode = iSysBaseAPI.getDepartIdsByOrgCode(user.getOrgCode());
		SysDepart byId = sysDepartService.getById(departIdsByOrgCode);
		String departName = byId.getDepartName();
		cwPpryTj.setUnit(departName);
		cwPpryTjMapper.updateById(cwPpryTj);

		// 其他工资福利支出
		Double acz = 0.0;
		Double afcz = 0.0;

		// 兼容 Java 8：定义需要执行计算的人员类型（所派遣无保险/退休返聘）
		List<String> calculateTypes = Arrays.asList("所派遣有保险", "院派遣", "借调");

		// 1. 先删除子表数据
		cwPpryMapper.deleteByMainId(cwPpryTj.getId());

		// 2. 子表数据重新插入
		if (cwPpryList != null && cwPpryList.size() > 0) {
			for (CwPpry entity : cwPpryList) {
				// 公共字段赋值（无论是否计算，都需设置）
				entity.setUserId(user.getId());
				entity.setUnit(cwPpryTj.getUnit());
				entity.setYear(cwPpryTj.getYear());
				entity.setMainId(cwPpryTj.getId()); // 外键设置

				// 1. 所有字段空值处理（统一设为 0.0，避免空指针）
				if (entity.getPostWage() == null) {
					entity.setPostWage(0.0);
				}
				if (entity.getIncrementalStep() == null) {
					entity.setIncrementalStep(0.0);
				}
				if (entity.getLivingAllowance() == null) {
					entity.setLivingAllowance(0.0);
				}
				if (entity.getWorkAllowance() == null) {
					entity.setWorkAllowance(0.0);
				}
				if (entity.getSanitationFee() == null) {
					entity.setSanitationFee(0.0);
				}
				if (entity.getJkbybt() == null) {
					entity.setJkbybt(0.0);
				}
				if (entity.getHealthSubsidies() == null) {
					entity.setHealthSubsidies(0.0);
				}
				if (entity.getHousingSubsidy() == null) {
					entity.setHousingSubsidy(0.0);
				}
				if (entity.getJcjxj() == null) {
					entity.setJcjxj(0.0);
				}
				if (entity.getXjgz() == null) {
					entity.setXjgz(0.0);
				}
				if (entity.getMeritPay() == null) {
					entity.setMeritPay(0.0);
				}
				if (entity.getSafety() == null) {
					entity.setSafety(0.0);
				}
				if (entity.getDeyb() == null) {
					entity.setDeyb(0.0);
				}
				if (entity.getHeatingFee() == null) {
					entity.setHeatingFee(0.0);
				}

				// 2. 判断是否为需要计算的人员类型（所派遣无保险/退休返聘）
				String dispatchY = entity.getDispatchY();
				// 判空：避免 dispatchY 为 null 时抛出空指针
				if (dispatchY != null && calculateTypes.contains(dispatchY)) {
					// 3. 仅对指定类型执行计算逻辑（财政/非财政分支）
					Double heji = entity.getPostWage() + entity.getIncrementalStep() + entity.getLivingAllowance() +
							entity.getWorkAllowance() + entity.getSanitationFee() + entity.getJkbybt() +
							entity.getHealthSubsidies() + entity.getHousingSubsidy() + entity.getJcjxj();
					// 全年工资小计
					long gzxj = Math.round(heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety());
					// 计算shebao并保留两位小数
					Double shebaoTemp = (entity.getPostWage() + entity.getXjgz() + entity.getLivingAllowance() + entity.getWorkAllowance() +
							entity.getJkbybt() + entity.getJcjxj()) * 12 + entity.getPostWage() + entity.getXjgz();
					Double shebao = new BigDecimal(shebaoTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算yibao并保留两位小数
					Double yibaoTemp = (heji - entity.getIncrementalStep() + entity.getXjgz()) * 12;
					Double yibao = new BigDecimal(yibaoTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算gjjn并保留两位小数
					Double gjjnTemp = (heji - entity.getIncrementalStep() + entity.getXjgz()) * 12 + (entity.getPostWage() + entity.getXjgz()) + entity.getMeritPay() + entity.getSafety();
					Double gjjn = new BigDecimal(gjjnTemp).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 各分项计算并分别保留两位小数
					Double item1 = new BigDecimal(shebao * 0.16).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item2 = new BigDecimal(yibao * 0.12).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item3 = new BigDecimal(shebao * 0.005).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item4 = new BigDecimal(shebao * 0.0035).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
					Double item5 = new BigDecimal(gjjn * 0.12).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					// 计算gjz（总和）
					Double gjz = new BigDecimal(item1 + item2 + item3 + item4 + item5 + entity.getDeyb()).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();

					long lwf = Math.round((gjz + gzxj + entity.getHeatingFee()) * 0.03);

					if ("财政".equals(entity.getCzFcz())) {
						acz = gzxj + gjz + lwf + entity.getHeatingFee();
						entity.setSummation(acz);
					} else {
						afcz = gzxj + gjz + lwf + entity.getHeatingFee();
						entity.setSummation(afcz);
					}

					// 赋值计算结果字段
					entity.setRehearsalSession(entity.getPostWage() + entity.getXjgz());
					entity.setSbjfjs(shebao);
					entity.setYbjfjs(yibao);
					entity.setGjjjs(gjjn);
					entity.setYgfhj(heji);
					entity.setEndowmentInsurance(item1);
					entity.setMedicare(item2);
					entity.setUnemployment(item3);
					entity.setGsbx(item4);
					entity.setAccumulationFund(item5);
					entity.setQngjxj(new BigDecimal(heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety()).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
					entity.setQnsbjgjj(gjz);
					entity.setDispatchServiceFee(new BigDecimal(((heji * 12 + entity.getPostWage() + entity.getXjgz() + entity.getMeritPay() + entity.getSafety()) + entity.getHeatingFee() + gjz) * 0.03).setScale(0, BigDecimal.ROUND_HALF_UP).doubleValue());
				} else {
					// 4. 非指定人员类型：相关计算字段设为 0（避免空值）
					entity.setRehearsalSession(0.0);
					entity.setSbjfjs(0.0);
					entity.setYbjfjs(0.0);
					entity.setGjjjs(0.0);
					entity.setYgfhj(0.0);
					entity.setEndowmentInsurance(0.0);
					entity.setMedicare(0.0);
					entity.setUnemployment(0.0);
					entity.setGsbx(0.0);
					entity.setAccumulationFund(0.0);
					entity.setQngjxj(0.0);
					entity.setQnsbjgjj(0.0);
					entity.setDispatchServiceFee(0.0);
					entity.setSummation(0.0);
				}

				// 插入数据库
				cwPpryMapper.insert(entity);
			}
		}
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void delMain(String id) {
		cwPpryMapper.deleteByMainId(id);
		cwPpryTjMapper.deleteById(id);
	}

	@Override
	@Transactional(rollbackFor = Exception.class)
	public void delBatchMain(Collection<? extends Serializable> idList) {
		for(Serializable id:idList) {
			cwPpryMapper.deleteByMainId(id.toString());
			cwPpryTjMapper.deleteById(id);
		}
	}
	
}
